/*!
 * \file RiskMonDefs.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 风控监控定义文件
 * \details 定义了风控监控系统的基础类和接口，包括风控上下文、风控监控器基类和风控监控器工厂接口
 */
#pragma once
#include "../Includes/WTSMarcos.h"

#include <stdio.h>
#include <stdint.h>
#include <string.h>

/**
 * @note 风控监控模块特别说明
 * @details 目前风控模块暂时来说是个扩展功能，只实现基础对接方式，满足要求。
 *          具体的通过行情或者数据处理时候的风控实现，
 *          需要在风控模块中自行处理。
 *          风控模块只能控制有效的防灾操作。
 */

NS_WTP_BEGIN
class WTSVariant;
class WTSPortFundInfo;

/**
 * @class WtPortContext
 * @brief 组合上下文类
 * @details 风控监控器的运行环境和接口提供者，负责为风控监控器提供资金信息、交易状态和其他必要服务。
 *          主要功能包括：
 *          - 资金信息查询
 *          - 交易状态监控
 *          - 仓位规模控制
 *          - 交易日期时间管理
 *          - 风控日志记录
 *          
 *          组合上下文是风控监控器与系统之间的桥梁，封装了所有必要的
 *          系统服务，使风控监控器能够专注于具体的风控逻辑实现。
 */
class WtPortContext
{
public:
	/**
	 * @brief 获取组合资金信息
	 * @details 获取当前组合的资金状况，包括可用资金、冻结资金、盈亏等信息。
	 * @return WTSPortFundInfo* 组合资金信息指针
	 */
	virtual WTSPortFundInfo*	getFundInfo() = 0;

	/**
	 * @brief 设置仓位缩放系数
	 * @details 用于控制仓位规模，进行风控管理。
	 * @param scale 缩放系数，一般小于等于1，用于控制仓位上限
	 */
	virtual void	setVolScale(double scale) = 0;

	/**
	 * @brief 检查是否在交易状态
	 * @details 判断当前是否处于可交易时段。
	 * @return bool 在交易状态为true，否则为false
	 */
	virtual bool	isInTrading() = 0;

	/**
	 * @brief 写风控日志
	 * @details 记录风控相关的日志信息。
	 * @param message 日志消息内容
	 */
	virtual void	writeRiskLog(const char* message) = 0;

	/**
	 * @brief 获取当前日期
	 * @details 获取系统当前日期。
	 * @return uint32_t 当前日期，格式如20240315
	 */
	virtual uint32_t	getCurDate() = 0;

	/**
	 * @brief 获取当前时间
	 * @details 获取系统当前时间。
	 * @return uint32_t 当前时间，格式如143000
	 */
	virtual uint32_t	getCurTime() = 0;

	/**
	 * @brief 获取当前交易日
	 * @details 获取当前的交易日期，与自然日期可能不同。
	 * @return uint32_t 交易日期，格式如20240315
	 */
	virtual uint32_t	getTradingDate() = 0;

	/**
	 * @brief 将时间转换为分钟数
	 * @details 将时间格式转换为距离零点的分钟数（仅内部有效）。
	 * @param uTime 时间值
	 * @return uint32_t 对应的分钟数
	 */
	virtual uint32_t	transTimeToMin(uint32_t uTime) = 0;
};

/**
 * @class WtRiskMonitor
 * @brief 风控监控器基类
 * @details 风控监控器的基础类，定义了风控监控器的基本接口和生命周期。
 *          主要功能包括：
 *          - 风控策略执行
 *          - 监控器生命周期管理
 *          - 风控参数配置
 *          - 实时风控检查
 *          
 *          风控监控器负责实时监控交易过程中的各种风险指标，
 *          如资金使用率、仓位集中度、盈亏控制等，并在发现
 *          风险时采取相应的控制措施。
 */
class WtRiskMonitor
{
public:
	/**
	 * @brief 构造函数
	 */
	WtRiskMonitor():_ctx(NULL){}
	virtual ~WtRiskMonitor(){}

public:
	/**
	 * @brief 获取风控监控器名称
	 * @details 返回风控监控器的唯一标识名称。
	 * @return const char* 监控器名称
	 */
	virtual const char* getName() = 0;

	/**
	 * @brief 获取风控监控器工厂名称
	 * @details 返回创建此风控监控器的工厂名称。
	 * @return const char* 工厂名称
	 */
	virtual const char* getFactName() = 0;

	/**
	 * @brief 初始化风控监控器
	 * @details 风控监控器的初始化方法，设置运行环境和配置参数。
	 * @param ctx 组合上下文环境
	 * @param cfg 配置参数
	 */
	virtual void init(WtPortContext* ctx, WTSVariant* cfg){ _ctx = ctx; }

	/**
	 * @brief 启动风控监控器
	 * @details 启动风控监控器，开始执行风控检查逻辑。
	 */
	virtual void run(){}

	/**
	 * @brief 停止风控监控器
	 * @details 停止风控监控器的运行，清理相关资源。
	 */
	virtual void stop(){}

protected:
	WtPortContext*	_ctx;		///< 组合上下文指针
};


//////////////////////////////////////////////////////////////////////////
/// @brief 风控监控器枚举回调函数类型
/// @param factName 工厂名称
/// @param unitName 监控器名称
/// @param isLast 是否为最后一个
typedef void(*FuncEnumRiskMonCallback)(const char* factName, const char* unitName, bool isLast);

/**
 * @class IRiskMonitorFact
 * @brief 风控监控器工厂接口
 * @details 风控监控器工厂的核心接口，负责风控监控器的创建、删除和管理。
 *          主要功能包括：
 *          - 风控监控器实例创建和销毁
 *          - 风控监控器类型枚举
 *          - 工厂标识管理
 *          
 *          风控监控器工厂采用工厂模式设计，支持动态加载和卸载风控监控器模块，
 *          为风控系统提供灵活的扩展机制。不同的风控策略可以通过
 *          不同的风控监控器来实现，如资金风控、仓位风控、盈亏风控等。
 */
class IRiskMonitorFact
{
public:
	IRiskMonitorFact(){}
	virtual ~IRiskMonitorFact(){}

public:
	/**
	 * @brief 获取工厂名称
	 * @details 返回风控监控器工厂的唯一标识名称。
	 * @return const char* 工厂名称
	 */
	virtual const char* getName() = 0;

	/**
	 * @brief 枚举风控监控器
	 * @details 枚举工厂支持的所有风控监控器类型，通过回调函数返回信息。
	 * @param cb 枚举回调函数，用于接收风控监控器信息
	 */
	virtual void enumRiskMonitors(FuncEnumRiskMonCallback cb) = 0;

	/**
	 * @brief 根据名称创建风控监控器
	 * @details 根据指定的风控监控器名称创建新的风控监控器实例。
	 * @param name 风控监控器名称
	 * @return WtRiskMonitor* 风控监控器实例指针，创建失败返回nullptr
	 */
	virtual WtRiskMonitor* createRiskMonotor(const char* name) = 0;

	/**
	 * @brief 删除风控监控器
	 * @details 销毁指定的风控监控器实例并释放相关资源。
	 * @param unit 要删除的风控监控器指针
	 * @return bool true表示删除成功，false表示失败
	 */
	virtual bool deleteRiskMonotor(WtRiskMonitor* unit) = 0;
};

/// @brief 创建风控工厂函数指针类型
typedef IRiskMonitorFact* (*FuncCreateRiskMonFact)();

/// @brief 删除风控工厂函数指针类型
typedef void(*FuncDeleteRiskMonFact)(IRiskMonitorFact* &fact);

NS_WTP_END
